Query Method 정의하기
✒️ 2025-05-28 13:25 내용 수정
- 참고 자료 : Spring Defining Query Methods
- Spring boot와 MongoDB를 연동한 후
MongoRepository인터페이스를 상속 받아 DB에 query를 수행할 때 필요한 메소드를 정의할 수 있다. - Repository 프록시는 메소드 이름에서 저장에 특화된 query를 가져오는 방법을 2가지 가지고 있다.
- 메소드 이름에서 직접 query를 가져오기
- 직접 정의한 query 사용하기
- 여기에선 프로젝트에서 사용했던
메소드 이름으로 query 설정하는 방법을 간단하게 정리했다.- 중간에 생략된 내용이 많기 때문에 더 상세한 자료는 위에 기재된 참고 자료에서 확인할 수 있다.
Method 이름으로 query 설정
-
이 방법에선 메소드 이름을 2가지 부분(Subject, Predicate)로 나뉜다.
- Subject :
find...By,exists...By와 같은 부분 - Predicate : 나머지 부분
- Subject :
-
find와By사이의 텍스트는Distinct이나Top/First와 같은 결과를 제한하는 키워드가 아닌 이상 설명으로 간주되어 특정 동작을 수행하진 않는다. -
지원되는 query 키워드는 다음 사이트를 참조 : Repository query keyword
-
첫번째
By키워드는 실제 조건 서술부의 시작을 표시하는 구분자 역할을 한다. -
예시는 공식 문서의 예시 중 일부를 그대로 가져왔다.
// Person 타입 객체를 찾는데, EmailAddress와 Lastname이 일치하는 객체를 찾음
List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);
// distinct 구문 추가 - 중복 허용 x
// Person 타입 객체를 찾는데, Lastname이 일치하거나 Firstname이 일치하는 사람을 중복 없이 찾음
List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);
// 개별 특성에서 대소문자 구분 x
// Person 타입 객체를 찾는데, Lastname이 일치하며 대소문자 구분하지 않음
List<Person> findByLastnameIgnoreCase(String lastname);
// 모든 적합 특성에서 대소문자 구분 x
// Person 타입 객체를 찾는데, Lastname과 Firstname이 일치하며, 둘 다 대소문자 구분하지 않음
List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);
// 정적 ORDER BY 옵션
// Person 타입 객체를 찾는데, Lastname이 일치하는 데이터를 Firstname 순으로 오름차순 정렬
List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
// Person 타입 객체를 찾는데, Lastname이 일치하는 데이터를 Firstname 순으로 내림차순 정렬
List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
- 위 예시에서 유추할 수 있는 것은Collection 내의
Person이라는Entity가 가지고 있는 속성들이 아래의 속성들을 포함한다는 것이다.- 이처럼
Entity내의 속성을 사용한 검색 및 정렬을 수행할 때MongoRepository의 메소드 이름에 해당 키워드를 넣어 작성하면 된다.
- 이처럼
class Person {
String lastname;
String firstname;
EmailAddress emailAddress;
}